package org.example.offical.doc.rag;

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.Metadata;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.parser.apache.tika.ApacheTikaDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentByCharacterSplitter;
import dev.langchain4j.data.document.splitter.DocumentByLineSplitter;
import dev.langchain4j.data.document.splitter.DocumentByParagraphSplitter;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import org.example.offical.doc.ModelUtils;

import java.util.List;

/**
 * 加载文档Document -> 分段 TextSegment
 *
 * @author superMan
 * @since fish_temp_since
 */
public class EasyRAG {

    public static void main(String[] args) {
        // langchain4j提供了很多 DocumentLoader，比如FileSystemDocumentLoader，ClassPathDocumentLoader等
        Document document = FileSystemDocumentLoader.loadDocument("src/main/java/org/example/offical/doc/rag/users.txt",
                // 文档解析器
                new ApacheTikaDocumentParser());

        List<TextSegment> split = new DocumentByCharacterSplitter(100, 100, new DocumentByCharacterSplitter(50, 50)).split(document);
        split.forEach(x -> {
            System.out.println("--");
            System.out.println(x.text());
            System.out.println("==");
        });
        /*
        metadata是很有用的
        1. 可以帮助LLM理解文档内容
        2. 在搜索的时候可以根据metadata进行过滤
        3. 可以通过metadata中的id等信息找到对应的文档，从而实现数据同步
         */
        Metadata metadata = document.metadata();

        // InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
        // EmbeddingStoreIngestor.ingest(document, embeddingStore);
        //
        // System.out.println(AiServices.builder(Assistant.class)
        //         .contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore))
        //         .chatLanguageModel(ModelUtils.getOpenAiDemoModel())
        //         .build().chat("介绍一下你自己"));


    }

    interface Assistant {
        String chat(String userMessage);
    }
}
